package array;
/**
 * @author huang (1431471764@qq.com)
 * @date 2025/8/8 22:45
 */

/**
 * @author 随风coding
 * @version 1.0
 * @date 2025/8/8 22:45
 * @description:
 * 给定一个正整数 n，生成一个包含 1 到 n^2 所有元素，且元素按顺时针顺序螺旋排列的正方形矩阵。
 *
 * 示例:
 *
 * 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
 */
public class SpiralMatrixGenerator {
    /**
     * 生成n×n的顺时针螺旋矩阵
     *
     * @param n 矩阵的阶数（n ≥ 0）
     * @return 填充后的螺旋矩阵（n=0时返回空数组）
     * @throws IllegalArgumentException 当n < 0时抛出
     */
    public static int[][] generateSpiralMatrix(int n) {
        if (n < 0) {
            throw new IllegalArgumentException("n不能为负数");
        }
        if (n == 0) {
            return new int[0][0];
        }

        int[][] matrix = new int[n][n];
        int startX = 0, startY = 0;  // 当前层的起始行、列
        int offset = 1;              // 控制当前层的边界
        int count = 1;               // 当前填充的数字（从1开始）
        int loop = 1;                // 当前处理的圈数（层数）
        int i, j;                    // 循环变量

        while (loop <= n / 2) {
            // 顶部行（左→右）
            for (j = startY; j < n - offset; j++) {
                matrix[startX][j] = count++;
            }

            // 右侧列（上→下）
            for (i = startX; i < n - offset; i++) {
                matrix[i][j] = count++;
            }

            // 底部行（右→左）
            for (; j > startY; j--) {
                matrix[i][j] = count++;
            }

            // 左侧列（下→上）
            for (; i > startX; i--) {
                matrix[i][j] = count++;
            }

            // 更新层参数（进入下一圈）
            startX++;
            startY++;
            offset++;
            loop++;
        }

        // 处理奇数阶矩阵的中心位置
        if (n % 2 == 1) {
            matrix[startX][startY] = count;
        }

        return matrix;
    }

    /**
     * main方法：测试生成螺旋矩阵的功能
     */
    public static void main(String[] args) {
        // 测试用例1：n=0（零阶矩阵）
        testCase(0);

        // 测试用例2：n=1（最小有效阶数）
        testCase(1);

        // 测试用例3：n=2（偶数阶）
        testCase(2);

        // 测试用例4：n=3（奇数阶）
        testCase(3);
    }

    /**
     * 执行单个测试用例
     *
     * @param n 矩阵阶数
     */
    private static void testCase(int n) {
        System.out.println("=== 测试用例：n=" + n + " ===");
        try {
            int[][] matrix = generateSpiralMatrix(n);
            System.out.println("生成的螺旋矩阵：");
            printMatrix(matrix);
        } catch (Exception e) {
            System.out.println("❌ 测试异常：" + e.getMessage());
        }
        System.out.println();  // 空行分隔
    }

    /**
     * 辅助方法：打印二维矩阵（格式化输出）
     *
     * @param matrix 待打印的矩阵
     */
    private static void printMatrix(int[][] matrix) {
        for (int[] row : matrix) {
            for (int num : row) {
                System.out.print(num + "\t");
            }
            System.out.println();
        }
    }
}
